/** 表格控件选项 */
export interface TableOptions {
  /** 行数，不包含表头和动态添加的行 */
  rows: number

  /** 列数，不包含表头 */
  cols: number

  /** 表格行高 */
  rowHeight: number

  /** 表格默认列宽 */
  colWidthDefault: number

  /** 表头宽度，仅适用纵向表格 */
  headerWidth: number

  /** 表头高度，仅适用横向表格 */
  headerHeight: number

  /** 表头位置 */
  headerPosition: TableHeaderPosition

  /** 隐藏表头 */
  headerHidden: boolean

  /**
   * 是否动态表格
   * 动态时允许填写时新增数据条目
   * 表头位置为 TableHeaderPosition.LEFT 时无法设置为动态
   */
  dynamic: boolean

  /** 必填数量 */
  requiredCount: number
}

/** 表格控件字段 */
export interface TableField {
  /** 表头标题 */
  label: string

  /** 填写占位文本 */
  placeholder: string

  /** 字段是否必填 */
  required: boolean

  /** 字段 id */
  id?: string

  /** 字段宽度，表头顶部时起作用 */
  width?: number
}

/**
 * 表格控件值
 * @example `[
 *   ['第一行第一列', '第一行第二列'],
 *   ['第二行第一列', '第二行第二列']
 * ]`
 */
export type TableValue = string[][]

/** 表格控件数据项 */
export interface TableItem {
  /** 纵向表格时列宽 */
  width?: number

  /** 对应字段的值，为 string */
  [fieldId: string]: string | number | undefined
}

/**
 * 表格列宽
 * 纵向表格如果未隐藏表头则包含表头
 * @example `[100, 250, 300]`
 */
export type TableColWidths = number[]

/** 表头位置 */
export enum TableHeaderPosition {
  /** 头部，默认 */
  TOP = 0,

  /** 左侧 */
  LEFT = 1
}

/** 表头位置 map */
export const TableHeaderPositionMap = new Map([
  [
    TableHeaderPosition.TOP,
    {
      tips: '',
      value: TableHeaderPosition.TOP,
      icon: 'fa-icon-header-top'
    }
  ],
  [
    TableHeaderPosition.LEFT,
    {
      tips: '设置为竖向表格时，无法设置动态表格',
      value: TableHeaderPosition.LEFT,
      icon: 'fa-icon-header-left'
    }
  ]
])

/** 表格插入方式，后端切图配置 */
export enum TableInsertWay {
  /** 新建页面添加 Table */
  Page = 0,

  /** 在某个坐标后面添加 Table */
  AXIS = 2
}

/** 表格编辑状态 */
export interface TableEditState {
  /** 数据项索引 */
  itemIndex: number

  /** 字段索引 */
  fieldIndex: number

  /** 表头索引 */
  headerIndex: number
}

/** 表格控件默认选项 */
export const TableDefault: TableOptions = {
  rows: 3,

  cols: 3,

  rowHeight: 32,

  colWidthDefault: 100,

  headerWidth: 100,

  headerHeight: 32,

  headerPosition: TableHeaderPosition.TOP,

  headerHidden: false,

  dynamic: false,

  requiredCount: 1
}
